"""
函数封装步骤：
1、功能代码写出来
2、def封装
3、参数化： 变化的数据定义为形参
4、返回值： 判断函数是否有数据需要给调用的人使用
   - 最终就是为了得到这个替换完成之后的字符串

封装的函数的优化：
1、记录日志： 方便问题定位 看到执行过程 == 但凡print看结果 或者debug看结果的地方都记录日志
2、因为有些用例可能没有在用例没有头部 参数 读取为空
 - 如果没有提取表达式 读出来的就是None  不能做反序列化。

优化的问题：--优化replace函数
1、目前函数值识别了变量名 去环境变量替换数据
2、并没有处理占位符里是函数名情况
  -如果是函数名的话 需要调用函数 执行函数  得到函数执行返回值的。
3、分支判断：
  - 如果mark是函数名字，以括号结尾或者() in mark：  "#gen_unregister_phone()#"
  - 如果mark是变量名：


"""
import allure

from data.envi_data import EnviData
from loguru import logger
import re
from tools.handle_gendata import GenData

# 为了演示 先写一个环境变量存在订单编号 ordernumber ，正常运行用例的时候会删掉
# class EnviData:
#     orderNumbers = "1762098974103441408"

@allure.step("数据占位符替换")
def replace_mark(str_data):
    if str_data is None:
        logger.info("数据为空，不需要做替换操作，直接返回！")
        return
    result = re.findall("#(.*?)#",str_data)
    # 1、先判断一下这个正则查找的结果列表是否为空
    if result: # 如果列表非空
        logger.info("-------------------开始替换数据-----------------------")
        logger.info(f"要替换的原始数据是：{str_data}")
        logger.info(f"要替换的占位符有：{result}")
        # 2、for循环遍历这个列表里的变量名
        for mark in result:
            # 分支判断：如果mark是函数名字，以括号结尾或者()
            if "()" in mark: # mark 是gen_unregister_phone()
                # mark是字符串类型 是函数 调用执行函数
                # 要在这个模块里执行函数 导包
                gen_data = eval(f'GenData().{mark}') # eval('GenData().gen_unregister_phone()')
                # 得到了随机生成数据 存在环境变量里：属性名-函数名去掉括号， 属性值 -- 函数结果
                var_name = mark.strip("()") # 属性名-函数名去掉括号
                setattr(EnviData,var_name,gen_data)
                # 替换掉字符串里本身的占位符--用函数结果替换 {"mobile":"#gen_unregister_phone()#"}
                str_data = str_data.replace(f"#{mark}#",str(gen_data))
                logger.info(f"环境变量的数据为：{EnviData.__dict__}")
            else:
                # 3、判断这个变量名是否存在环境变量的属性名 【类里是否有这个属性】
                if hasattr(EnviData,mark):
                    # 4、如果有这个属性 替换属性值
                    str_data = str_data.replace(f"#{mark}#",str(getattr(EnviData,mark))) # 转化为字符串类型
    else:
        logger.info(f"要替换的占位符为空：{result}，不需要做替换")
    logger.info(f"替换完成之后的字符串为：{str_data}")
    return str_data

if __name__ == '__main__':
    class EnviData:
        prodId = 123
        skuId = 456
    # str_data = '{"basketId": 0, "count": 1111, "prodId": #prodId#, "shopId": 1, "skuId": #skuId#}'
    str_data = '{"mobile": "#gen_unregister_phone()#"}'
    print(replace_mark(str_data))
